package net.eyra.struts.actions;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.eyra.negocio.Constantes;
import net.eyra.negocio.dao.EyraDaoException;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.negocio.entidades.explotacion.Parque;
import net.eyra.negocio.entidades.explotacion.Tarificador;
import net.eyra.negocio.entidades.gestion.Usuario;
import net.eyra.negocio.explotacion.mantenimiento.CargaExcelConCurvasCarga;
import net.eyra.negocio.explotacion.mantenimiento.ComprobarCurvas;
import net.eyra.negocio.explotacion.mantenimiento.ComprobarMedidas;
import net.eyra.negocio.explotacion.produccion.Informes;
import net.eyra.negocio.explotacion.produccion.Produccion;
import net.eyra.negocio.explotacion.produccion.ResumenProduccionAExcel;
import net.eyra.planificador.CargadorTareas;
import net.eyra.planificador.Tarea;
import net.eyra.utiles.FicheroException;
import net.eyra.utiles.FormateoFechaException;
import net.eyra.utiles.Path;
import net.eyra.utiles.Periodo;
import net.eyra.utiles.Zip;

import org.apache.catalina.connector.Response;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.google.gson.Gson;

public class ExplotacionAction extends DispatchAction {

    public ActionForward ResumenProduccion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                            throws ParseException {
        Produccion produccion = new Produccion();

        try {
            List<Parque> resumen = produccion.ResumenProduccion(((Usuario) request.getSession().getAttribute("usuario")).getGrupo().getParques());

            for (Parque parque : resumen) {
                for (Tarificador tarificador : parque.getTarificadores()) {

                    // Ajustamos el array añadiendole al principio los meses, a cero, que faltan hasta principio de año.
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(tarificador.getLecturas_tm1().get(0).getPeriodo());
                    int _mes = calendar.get(Calendar.MONTH);
                    for (int x = _mes; x > 0; x--) {
                        Lectura lectura = new Lectura();
                        calendar.add(Calendar.MONTH, -1);
                        lectura.setPeriodo(calendar.getTime());
                        lectura.setActiva_exportada(0);
                        lectura.setActiva_importada(0);
                        lectura.setReactiva_q1(0);
                        lectura.setReactiva_q2(0);
                        lectura.setReactiva_q3(0);
                        lectura.setReactiva_q4(0);
                        tarificador.getLecturas_tm1().add(0, lectura);
                    }

                    // Ajustamos el array añadiendole al final los meses, a cero, que faltan hasta finales de año.
                    calendar.setTime(tarificador.getLecturas_tm1().get(tarificador.getLecturas_tm1().size() - 1).getPeriodo());
                    _mes = calendar.get(Calendar.MONTH) + 1;
                    for (int x = _mes; x < 12; x++) {
                        Lectura lectura = new Lectura();
                        calendar.add(Calendar.MONTH, 1);
                        lectura.setPeriodo(calendar.getTime());
                        lectura.setActiva_exportada(0);
                        lectura.setActiva_importada(0);
                        lectura.setReactiva_q1(0);
                        lectura.setReactiva_q2(0);
                        lectura.setReactiva_q3(0);
                        lectura.setReactiva_q4(0);
                        tarificador.getLecturas_tm1().add(lectura);
                    }

                }
            }

            List<String> meses = new ArrayList<String>();
            meses.add("Enero");
            meses.add("Febrero");
            meses.add("Marzo");
            meses.add("Abril");
            meses.add("Mayo");
            meses.add("Junio");
            meses.add("Julio");
            meses.add("Agosto");
            meses.add("Septiembre");
            meses.add("Octubre");
            meses.add("Noviembre");
            meses.add("Diciembre");

            String separador = System.getProperty("file.separator");
            String path_fichero = request.getSession().getServletContext().getRealPath(request.getContextPath()) + separador + "temp" + separador;
            String nombre_fichero = "RESUMEN_PRODUCCION";

            ResumenProduccionAExcel excel = new ResumenProduccionAExcel();
            excel.generarHoja(resumen);
            excel.grabarFichero(path_fichero + nombre_fichero + ".xls");
            String[] ficheros = { path_fichero + nombre_fichero + ".xls" };

            Zip zip = new Zip();
            String nombre_final = nombre_fichero + "_" + System.currentTimeMillis();
            zip.guardarZip(path_fichero + nombre_final, ficheros, true);

            request.setAttribute("meses", meses);
            request.setAttribute("resumen_produccion", resumen);
            request.setAttribute("nombre_fichero", nombre_final + ".zip");
        } catch (EyraDaoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FicheroException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return mapping.findForward("resumen_produccion");
    }

    public ActionForward CargarInformeDiario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                              throws ParseException,
                                                                                                                                              IOException {

        CargadorTareas cargador = new CargadorTareas();
        String fichero = Path.getPathTareas() + "InformeDiario.tarea";
        Tarea tarea = cargador.CargarTarea(fichero);

        Gson json = new Gson();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/plain");
        response.getWriter().write(json.toJson(tarea));

        return null;
    }

    public ActionForward ModificarInformeDiario(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                                 throws ParseException {
        String fichero = Path.getPathTareas() + "InformeDiario.tarea";
        Tarea tarea = new Tarea();

        String nombre = request.getParameter("nombre").trim();
        String fecha_inicio = request.getParameter("fecha_inicio").trim();
        String hora_inicio = request.getParameter("hora_inicio").trim();
        String dias_semana = request.getParameter("dias_semana").trim();
        String minutos_repeticion = request.getParameter("minutos_repeticion").trim();
        String nombre_clase = request.getParameter("nombre_clase").trim();
        String activa = request.getParameter("activa").trim().toUpperCase();
        String fecha_ultima = request.getParameter("fecha_ultima").trim();
        String hora_ultima = request.getParameter("hora_ultima").trim();

        tarea.setNombre(nombre);
        tarea.setFechaInicio(fecha_inicio);
        tarea.setHoraInicio(hora_inicio);
        tarea.setDiasSemana(dias_semana);
        tarea.setRepeticionMinutos(minutos_repeticion);
        tarea.setNombreClaseTarea(nombre_clase);
        tarea.setActiva(activa);
        tarea.setFechaUltimaEjecucion(fecha_ultima);
        tarea.setHoraUltimaEjecucion(hora_ultima);

        GrabarTarea(fichero, tarea);

        return null;
    }

    public void GrabarTarea(String ficheroTarea, Tarea tarea) {
        try {
            BufferedWriter bf = new BufferedWriter(new FileWriter(ficheroTarea, false));

            bf.append("Nombre=" + tarea.getNombre());
            bf.newLine();
            bf.append("Fecha_Inicio=" + tarea.getFechaInicio());
            bf.newLine();
            bf.append("Hora_Inicio=" + tarea.getHoraInicio());
            bf.newLine();
            bf.append("Dias_Semana=" + tarea.getDiasSemana());
            bf.newLine();
            bf.append("Minutos_Repeticion=" + tarea.getRepeticionMinutos());
            bf.newLine();
            bf.append("Nombre_Clase_Tarea=" + tarea.getNombreClaseTarea());
            bf.newLine();
            bf.append("Activa=" + tarea.getActiva());
            bf.newLine();
            bf.append("Fecha_Ultima_Ejecucion=" + tarea.getFechaUltimaEjecucion());
            bf.newLine();
            bf.append("Hora_Ultima_Ejecucion=" + tarea.getHoraUltimaEjecucion());

            bf.flush();
            bf.close();
        } catch (IOException e) {
        }
    }

    public ActionForward Exportar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

        Informes informe = new Informes();
        String separador = System.getProperty("file.separator");

        String[] id_tarificadores = request.getParameter("tarificadores").split(",");
        String periodo = request.getParameter("periodo");
        int origen = Integer.parseInt(request.getParameter("origen"));
        boolean tm1 = (request.getParameter("tm1").toLowerCase().equals("on") ? true : false);
        boolean tm2 = (request.getParameter("tm2").toLowerCase().equals("on") ? true : false);
        boolean resumen_diario = (request.getParameter("diario").toLowerCase().equals("on") ? true : false);
        boolean calculo_reactiva = (request.getParameter("reactiva").toLowerCase().equals("on") ? true : false);

        int curvas_carga = (tm1 ? Constantes.CURVAS_CARGA_TM1 : 0) + (tm2 ? Constantes.CURVAS_CARGA_TM2 : 0);
        // En caso de no haber seleccionado ni TM1, ni TM2 ni Diario, entonces por defecto se genera
        // TM1.
        if (curvas_carga == 0 && !resumen_diario) curvas_carga = Constantes.CURVAS_CARGA_TM1;

        String path_fichero = request.getSession().getServletContext().getRealPath(request.getContextPath()) + separador + "temp" + separador;
        String nombre_fichero = "CURVAS_CARGA_" + System.currentTimeMillis();

        String fecha_inicial_tmp = null;
        String fecha_final_tmp = null;

        if (periodo.length() > 2) {
            fecha_inicial_tmp = periodo.substring(0, periodo.indexOf("-")).trim();
            fecha_final_tmp = periodo.substring(periodo.indexOf("-") + 1).trim();
        } else {
            Periodo per = new Periodo();

            // Mes Actual
            if (periodo.equals("1")) {
                per.DesdePrimeroMes();
                fecha_inicial_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_INICIAL, Periodo.SEPARADOR_FECHA_SLASH);
                fecha_final_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_FINAL, Periodo.SEPARADOR_FECHA_SLASH);
            }

            // Mes Pasado
            if (periodo.equals("2")) {
                int mes = per.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) == 0 ? 11 : per.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) - 1;
                if (mes == 11) {
                    per.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO, per.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO) - 1);
                    per.setDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO, per.getDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO) - 1);
                }
                per.MesCompleto(mes);
                fecha_inicial_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_INICIAL, Periodo.SEPARADOR_FECHA_SLASH);
                fecha_final_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_FINAL, Periodo.SEPARADOR_FECHA_SLASH);
            }

            // Año actual
            if (periodo.equals("3")) {
                per.DesdePrimeroAño();
                fecha_inicial_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_INICIAL, Periodo.SEPARADOR_FECHA_SLASH);
                fecha_final_tmp = per.getFechaFormateada(Periodo.FORMATO_FECHA_DD_MM_AAAA, Periodo.FECHA_FINAL, Periodo.SEPARADOR_FECHA_SLASH);
            }
        }

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        try {
            Date fecha_inicial = sdf.parse(fecha_inicial_tmp);
            Date fecha_final = sdf.parse(fecha_final_tmp);

            informe.ExportarCurvasCarga((Usuario) request.getSession().getAttribute("usuario"), path_fichero, nombre_fichero, id_tarificadores,
                                        fecha_inicial, fecha_final, origen, curvas_carga, resumen_diario, calculo_reactiva);

            String fichero_zip = nombre_fichero + ".zip";
            response.sendRedirect(System.getProperty("file.separator") + "temp" + System.getProperty("file.separator") + fichero_zip);
        } catch (ParseException e) {
        } catch (FormateoFechaException e) {
        } catch (FicheroException e) {
        } catch (IOException e) {
        } catch (EyraDaoException e) {
        }

        return null;
    }

    public ActionForward SubirFicheroExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

        PrintWriter writer = null;
        InputStream is = null;
        OutputStream fos = null;

        try {
            writer = response.getWriter();
        } catch (IOException ex) {
            System.out.print(ex.getMessage());
        }

        String filename = request.getParameter("qqfile");

        try {
            is = request.getInputStream();
            fos = new FileOutputStream(new File(Path.getPathTemp() + filename));

            int x = 0;
            while ((x = is.read()) != -1)
                fos.write(x);

            response.setStatus(Response.SC_OK);
            writer.print("{success: true}");
        } catch (FileNotFoundException ex) {
            response.setStatus(Response.SC_INTERNAL_SERVER_ERROR);
            writer.print("{success: false}");
            System.out.print(ex.getMessage());
        } catch (IOException ex) {
            response.setStatus(Response.SC_INTERNAL_SERVER_ERROR);
            writer.print("{success: false}");
            System.out.print(ex.getMessage());
        } catch (NullPointerException ex) {
            response.setStatus(Response.SC_INTERNAL_SERVER_ERROR);
            writer.print("{success: false}");
            System.out.print(ex.getMessage());
        } finally {
            try {
                fos.close();
                is.close();
            } catch (IOException ignored) {
            }
        }

        writer.flush();
        writer.close();

        return null;
    }

    public ActionForward ImportarExcel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                        throws IOException {

        int id_tarificador = Integer.parseInt(request.getParameter("id_tarificador"));
        String _periodo = request.getParameter("periodo");
        int origen = Integer.parseInt(request.getParameter("origen"));
        boolean tm = Integer.parseInt(request.getParameter("tm")) == 1 ? true : false;
        int num_linea = Integer.parseInt(request.getParameter("numero_linea"));
        String nombre_fichero = request.getParameter("nombre_fichero").trim();

        String fecha_inicial_tmp = null;
        String fecha_final_tmp = null;

        fecha_inicial_tmp = _periodo.substring(0, _periodo.indexOf("-")).trim();
        fecha_final_tmp = _periodo.substring(_periodo.indexOf("-") + 1).trim();

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        try {
            Date fecha_inicial = sdf.parse(fecha_inicial_tmp);
            Date fecha_final = sdf.parse(fecha_final_tmp);

            Periodo periodo = new Periodo(fecha_inicial, fecha_final);
            periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA, periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA) + 1);
            CargaExcelConCurvasCarga carga = new CargaExcelConCurvasCarga();
            carga.CargarHojaExcel(id_tarificador, Path.getPathTemp() + nombre_fichero, tm, num_linea, periodo);

            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write("success");

        } catch (ParseException e) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(e.toString());
        } catch (Exception e) {
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(e.toString());
        }

        return null;
    }

    public ActionForward UltimaActualizacion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                              throws ParseException {
        Produccion produccion = new Produccion();

        try {
            List<String[]> actualizados = produccion.FechasUltimaActualizacion((Usuario) request.getSession().getAttribute("usuario"));
            Periodo periodo = new Periodo();
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

            List<String[]> sin_actualizar = new ArrayList<String[]>();

            for (int x = 0; x < actualizados.size(); x++) {
                String[] actualizacion = actualizados.get(x);
                periodo.setFecha_final(sdf.parse(actualizacion[1]));
                if (periodo.CompararFechas() < 0) {
                    sin_actualizar.add(actualizacion);
                    actualizados.remove(actualizacion);
                    x--;
                } else {
                    periodo.setFecha_final(sdf.parse(actualizacion[2]));
                    if (periodo.CompararFechas() < 0) {
                        sin_actualizar.add(actualizacion);
                        actualizados.remove(actualizacion);
                        x--;
                    }
                }
            }

            if (actualizados != null && actualizados.size() > 0) request.setAttribute("ultimas_actualizaciones", actualizados);
            if (sin_actualizar != null && sin_actualizar.size() > 0) request.setAttribute("sin_actualizar", sin_actualizar);
        } catch (EyraDaoException e) {
        }

        return mapping.findForward("ultimas_actualizaciones");
    }

    public ActionForward EstadoMedidas(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
                                                                                                                                        throws EyraDaoException,
                                                                                                                                        FormateoFechaException {

        ComprobarCurvas comprobarCurvas = new ComprobarCurvas();
        ComprobarMedidas comprobarMedidas = new ComprobarMedidas();

        Calendar hoy = Calendar.getInstance();
        hoy.set(Calendar.HOUR_OF_DAY, 0);
        hoy.set(Calendar.MINUTE, 0);
        hoy.set(Calendar.SECOND, 0);
        hoy.set(Calendar.MILLISECOND, 0);

        int id_parque = Integer.parseInt(request.getParameter("id_parque"));
        String periodo = request.getParameter("periodo");

        Periodo _periodo = new Periodo();
        if (periodo == null) periodo = "1";

        // Mes Actual
        if (periodo.equals("1")) {
            _periodo.DesdePrimeroMes();
            _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA, _periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA) - 1);
        }

        // Mes Pasado
        if (periodo.equals("2")) {
            int mes = _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) == 0 ? 11 : _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) - 1;
            if (mes == 11) {
                _periodo.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO, _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO) - 1);
                _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO, _periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO) - 1);
            }
            _periodo.MesCompleto(mes);
        }

        // Fecha Concreta
        if (periodo.equals("3")) {
            int _mes = Integer.parseInt(request.getParameter("mes")) - 1;
            int _anno = Integer.parseInt(request.getParameter("anno"));
            _periodo = new Periodo(_mes, _anno);
            _periodo.MesCompleto(_mes);
            request.setAttribute("fecha", request.getParameter("mes") + "/" + request.getParameter("anno"));
        }

        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.HORA, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.MINUTO, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.SEGUNDO, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.MILISEGUNDO, 0);

        // TODO - Sirve para que enviemos una marca indicando si hay problemas
        boolean comprobar = Integer.parseInt(request.getParameter("comprobar")) == 1 ? true : false;

        List<Parque> parques = comprobarCurvas.UltimaLecturaDeMedidas((List<Parque>) request.getSession().getAttribute("parques_autorizados"));
        for (Parque parque : parques) {
            for (Tarificador tarificador : parque.getTarificadores()) {
                if (comprobar && parque.getPropio().equalsIgnoreCase("S")) {
                    tarificador.getLecturas_tm1().get(0).setActiva_exportada(0);
                    tarificador.getLecturas_tm2().get(0).setActiva_exportada(0);
                    if (comprobarMedidas.TotalLecturas(tarificador.getId_tarificador(), _periodo, true) != comprobarMedidas.TotalLecturas(tarificador.getId_tarificador(),
                                                                                                                                          _periodo,
                                                                                                                                          false)) {
                        tarificador.getLecturas_tm1().get(0).setActiva_exportada(1);
                        tarificador.getLecturas_tm2().get(0).setActiva_exportada(1);
                    }
                } else {
                    if (tarificador.getLecturas_tm1().get(0).getFecha() == null
                            || tarificador.getLecturas_tm1().get(0).getFecha().compareTo(hoy.getTime()) < 0)
                        tarificador.getLecturas_tm1().get(0).setActiva_exportada(1);
                    if (tarificador.getLecturas_tm2().get(0).getFecha() == null
                            || tarificador.getLecturas_tm2().get(0).getFecha().compareTo(hoy.getTime()) < 0)
                        tarificador.getLecturas_tm2().get(0).setActiva_exportada(1);
                }
            }
        }

        request.setAttribute("periodo", periodo);
        if (id_parque == 0) request.setAttribute("parques_sin_actualizar", parques);

        if (comprobar) return mapping.findForward("comprobar_medidas");
        return mapping.findForward("ultimas_actualizaciones");
    }

    public ActionForward ComprobarMedidas(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

        String periodo = request.getParameter("periodo");
        int id_tarificador = Integer.parseInt(request.getParameter("id_tarificador"));

        Periodo _periodo = new Periodo();

        // Mes Actual
        if (periodo.equals("1")) {
            _periodo.DesdePrimeroMes();
            _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA, _periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA) - 1);
        }

        // Mes Pasado
        if (periodo.equals("2")) {
            int mes = _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) == 0 ? 11 : _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MES) - 1;
            if (mes == 11) {
                _periodo.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO, _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO) - 1);
                _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO, _periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.AÑO) - 1);
            }
            _periodo.MesCompleto(mes);
        }

        // Fecha Concreta
        if (periodo.equals("3")) {
            int _mes = Integer.parseInt(request.getParameter("mes")) - 1;
            int _anno = Integer.parseInt(request.getParameter("anno"));
            _periodo.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.AÑO, _anno);
            _periodo.MesCompleto(_mes);
            request.setAttribute("fecha", request.getParameter("mes") + "/" + request.getParameter("anno"));
        }

        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.HORA, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.MINUTO, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.SEGUNDO, 0);
        _periodo.setDatoFecha(Periodo.FECHA_FINAL, Periodo.MILISEGUNDO, 0);

        ComprobarMedidas comprobar = new ComprobarMedidas();

        try {
            comprobar.ComprobarCurvas(id_tarificador, _periodo);
        } catch (EyraDaoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FormateoFechaException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        request.setAttribute("num_horas_tm1", (_periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA)) * 24);
        request.setAttribute("num_horas_tm2", (_periodo.getDatoFecha(Periodo.FECHA_FINAL, Periodo.DIA)) * 24 * 4);
        request.setAttribute("num_horas_mes_tm1", (_periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES)) * 24);
        request.setAttribute("num_horas_mes_tm2", (_periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIAS_MES)) * 24 * 4);
        request.setAttribute("num_lecturas_tm1", comprobar.getNum_lecturas_tm1());
        request.setAttribute("num_lecturas_tm2", comprobar.getNum_lecturas_tm2());
        request.setAttribute("huecos_tm1", AgruparHuecos(comprobar.getLecturas_fechas_perdidas_tm1(), true));
        request.setAttribute("huecos_tm2", AgruparHuecos(comprobar.getLecturas_fechas_perdidas_tm2(), false));
        request.setAttribute("duplicados_tm1", comprobar.getLecturas_fechas_duplicadas_tm1());
        request.setAttribute("duplicados_tm2", comprobar.getLecturas_fechas_duplicadas_tm2());
        request.setAttribute("diferentes_tm1", comprobar.getLecturas_fechas_diferentes_tm1());
        MarcarUltimoCuartoHorario(comprobar.getLecturas_fechas_diferentes_tm2());
        request.setAttribute("diferentes_tm2", comprobar.getLecturas_fechas_diferentes_tm2());
        MarcarTarificadoresConError(comprobar.getTotal_tm1(), comprobar.getTotal_tm2());
        request.setAttribute("total_tm1", comprobar.getTotal_tm1());
        request.setAttribute("total_tm2", comprobar.getTotal_tm2());
        request.setAttribute("nombre_tarificador", comprobar.getNombreTarificador());

        request.setAttribute("periodo", periodo);

        return mapping.findForward("corregir_medidas");
    }

    private List<String> AgruparHuecos(List<Lectura> huecos, boolean horaria) {
        List<String> _huecos = new ArrayList<String>();
        if (huecos != null && huecos.size() > 0) {
            Lectura primera = null;
            Lectura segunda = null;
            Periodo fecha = null;
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
            for (Lectura lectura : huecos) {
                if (fecha == null) fecha = new Periodo(lectura.getFecha(), lectura.getFecha());
                if (primera == null) primera = lectura;
                else {
                    if (fecha.getFecha_inicial().equals(lectura.getFecha())) segunda = lectura;
                    else {
                        String hueco = "[" + sdf.format(primera.getFecha()) + (segunda == null ? "]" : " - " + sdf.format(segunda.getFecha()) + "]");
                        _huecos.add(hueco);
                        primera = lectura;
                        fecha = new Periodo(lectura.getFecha(), lectura.getFecha());
                        segunda = null;
                    }
                }
                if (horaria) fecha.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.HORA, fecha.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.HORA) + 1);
                else fecha.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.MINUTO, fecha.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MINUTO) + 15);
            }
            if (primera != null) {
                String hueco = "[" + sdf.format(primera.getFecha()) + (segunda == null ? "]" : " - " + sdf.format(segunda.getFecha()) + "]");
                _huecos.add(hueco);
            }
        }

        return _huecos;
    }

    /**
     * Se marca para poder crear el enlace a 'corregir' en la página corregir_medidas.jsp.
     * 
     * @param lecturas_fechas_diferentes_tm2
     */
    private void MarcarUltimoCuartoHorario(List<Lectura> lecturas_tm2) {
        if (lecturas_tm2 != null) {
            int x = 1;
            for (Lectura lectura : lecturas_tm2) {
                if (lectura.getPeriodo() != null) {
                    lectura.setS1(0);
                    if (x == 4) {
                        lectura.setS1(1);
                        x = 0;
                    }
                    x++;
                }
            }
        }
    }

    /**
     * Con esto marcamos los totales TM2 que son distintos a los de TM1 para poder ponerlos de otro color en pantalla.
     * 
     * @param total_tm1
     * @param total_tm2
     */
    private void MarcarTarificadoresConError(Lectura total_tm1, Lectura total_tm2) {
        total_tm2.setS1(0);
        total_tm2.setS2(0);
        total_tm2.setS3(0);
        total_tm2.setS4(0);
        total_tm2.setS5(0);
        total_tm2.setS6(0);
        if (total_tm1.getActiva_importada() != total_tm2.getActiva_importada()) total_tm2.setS1(1);
        if (total_tm1.getActiva_exportada() != total_tm2.getActiva_exportada()) total_tm2.setS2(1);
        if (total_tm1.getReactiva_q1() != total_tm2.getReactiva_q1()) total_tm2.setS3(1);
        if (total_tm1.getReactiva_q2() != total_tm2.getReactiva_q2()) total_tm2.setS4(1);
        if (total_tm1.getReactiva_q3() != total_tm2.getReactiva_q3()) total_tm2.setS5(1);
        if (total_tm1.getReactiva_q4() != total_tm2.getReactiva_q4()) total_tm2.setS6(1);
    }

    public ActionForward CorregirMedida(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
        int id_tarificador = Integer.parseInt(request.getParameter("id_tarificador"));
        int hora = Integer.parseInt(request.getParameter("hora"));
        String periodo = request.getParameter("periodo");
        String mes = request.getParameter("mes");

        ComprobarMedidas cm = new ComprobarMedidas();
        try {
            cm.CorregirMedida(id_tarificador, hora, periodo);
        } catch (FormateoFechaException e) {
            e.printStackTrace();
        } catch (EyraDaoException e) {
            e.printStackTrace();
        }

        request.setAttribute("periodo", mes);
        request.setAttribute("id_tarificador", String.valueOf(id_tarificador));

        return ComprobarMedidas(mapping, form, request, response);
    }
}
